home *** CD-ROM | disk | FTP | other *** search
/ Workbench Add-On / Workbench Add-On - Volume 1.iso / Dev / Oberon / source / amiga / Hardware.mod < prev    next >
Text File  |  1995-06-29  |  14KB  |  532 lines

  1. (**************************************************************************
  2.  
  3.      $RCSfile: Hardware.mod $
  4.   Description: Definitions for Amiga hardware and custom chips
  5.  
  6.    Created by: fjc (Frank Copeland)
  7.     $Revision: 3.8 $
  8.       $Author: fjc $
  9.         $Date: 1995/06/04 23:13:14 $
  10.  
  11.   Includes Release 40.15
  12.  
  13.   (C) Copyright 1985-1993 Commodore-Amiga, Inc.
  14.       All Rights Reserved
  15.  
  16.   Oberon-A interface Copyright © 1994-1995, Frank Copeland.
  17.   This file is part of the Oberon-A Interface.
  18.   See Oberon-A.doc for conditions of use and distribution.
  19.  
  20. ***************************************************************************)
  21.  
  22. <* STANDARD- *>
  23.  
  24. MODULE [2] Hardware;
  25.  
  26. IMPORT SYS := SYSTEM, e := Exec, s := Sets;
  27.  
  28. (*
  29. **      $VER: adkbits.h 39.1 (18.9.92)
  30. **
  31. **      bit definitions for adkcon register
  32. *)
  33.  
  34. CONST
  35.  
  36.   adkSet   * = 15; (* standard set/clear bit *)
  37.   preComp1 * = 14; (* two bits of precompensation *)
  38.   preComp0 * = 13;
  39.   mfmPrec  * = 12; (* use mfm style precompensation *)
  40.   uartBrk  * = 11; (* force uart output to zero *)
  41.   wordSync * = 10; (* enable DSKSYNC register matching *)
  42.   msbSync  * =  9; (* (Apple GCR Only) sync on MSB for reading *)
  43.   fast     * =  8; (* 1 -> 2 us/bit (mfm), 2 -> 4 us/bit (gcr) *)
  44.   use3pn   * =  7; (* use aud chan 3 to modulate period of ?? *)
  45.   use2p3   * =  6; (* use aud chan 2 to modulate period of 3 *)
  46.   use1p2   * =  5; (* use aud chan 1 to modulate period of 2 *)
  47.   use0p1   * =  4; (* use aud chan 0 to modulate period of 1 *)
  48.   use3vn   * =  3; (* use aud chan 3 to modulate volume of ?? *)
  49.   use2v3   * =  2; (* use aud chan 2 to modulate volume of 3 *)
  50.   use1v2   * =  1; (* use aud chan 1 to modulate volume of 2 *)
  51.   use0v1   * =  0; (* use aud chan 0 to modulate volume of 1 *)
  52.  
  53.   pre000ns  * = {};                     (* 000 ns of precomp *)
  54.   pre140ns  * = { preComp0 };           (* 140 ns of precomp *)
  55.   pre280ns  * = { preComp1 };           (* 280 ns of precomp *)
  56.   pre560ns  * = { preComp0, preComp1 }; (* 560 ns of precomp *)
  57.  
  58. (*
  59. **      $VER: blit.h 39.1 (18.9.92)
  60. **
  61. **      Defines for direct hardware use of the blitter.
  62. *)
  63.  
  64. CONST
  65.  
  66.   hSizeBits* = 6;
  67.   vSizeBits* = 16-hSizeBits;
  68.   hSizeMask* = 3FH;        (* 2^6 -- 1 *)
  69.   vSizeMask* = 3FFH;       (* 2^10 - 1 *)
  70.  
  71. (* all agnii support horizontal blit of at least 1024 bits (128 bytes) wide *)
  72. (* some agnii support horizontal blit of up to 32768 bits (4096 bytes) wide *)
  73.  
  74. (* #ifndef  NO_BIG_BLITS *)
  75.  
  76.   minBytesPerRow * = 128;
  77.   maxBytesPerRow * = 4096;
  78.  
  79. (* #else *)
  80.  
  81. (* maxBytesPerRow * = 128; *)
  82.  
  83. (* #endif *)
  84.  
  85. (* definitions for blitter control register 0 *)
  86.  
  87.   abc   * = 7;
  88.   abnc  * = 6;
  89.   anbc  * = 5;
  90.   anbnc * = 4;
  91.   nabc  * = 3;
  92.   nabnc * = 2;
  93.   nanbc * = 1;
  94.   nanbnc* = 0;
  95.  
  96. (* some commonly used operations *)
  97.   aORb   * = { abc, anbc, nabc, abnc, anbnc, nabnc };
  98.   aORc   * = { abc, nabc, abnc, anbc, nanbc, anbnc };
  99.   aXORc  * = { nabc, abnc, nanbc, anbnc };
  100.   aTOd   * = { abc, anbc, abnc, anbnc };
  101.  
  102.   dest * = 8;
  103.   srcC * = 9;
  104.   srcB * = 10;
  105.   srcA * = 11;
  106.   ash1 * = 12;
  107.   ash2 * = 13;
  108.   ash4 * = 14;
  109.   ash8 * = 15;
  110.  
  111.   desc * = 1;         (* blitter descend direction *)
  112.  
  113.   aShiftShift * = 12;       (* bits to right align ashift value *)
  114.   bShiftShift * = 12;       (* bits to right align bshift value *)
  115.  
  116. (* definations for blitter control register 1 *)
  117.   lineMode    * = 0;
  118.   fillOr      * = 3;
  119.   fillXor     * = 4;
  120.   fillCarryIn * = 2;
  121.   oneDot      * = 1;      (* one dot per horizontal line *)
  122.   ovFlag      * = 5;
  123.   signFlag    * = 6;
  124.   blitReverse * = 1;
  125.  
  126.   sud         * = {fillXor};
  127.   sul         * = {fillOr};
  128.   aul         * = {fillCarryIn};
  129.  
  130.   octant8  * = sul+sud;
  131.   octant7  * = aul;
  132.   octant6  * = aul+sul;
  133.   octant5  * = aul+sul+sud;
  134.   octant4  * = aul+sud;
  135.   octant3  * = sul;
  136.   octant2  * = {};
  137.   octant1  * = sud;
  138.  
  139. (* stuff for blit qeuer *)
  140.  
  141. TYPE
  142.  
  143.   BltnodePtr* = POINTER TO Bltnode;
  144.   Bltnode* = RECORD
  145.     n       * : BltnodePtr;
  146.     function* : e.PROC;
  147.     stat    * : CHAR;
  148.     blitsize* : INTEGER;
  149.     beamsync* : INTEGER;
  150.     cleanup * : e.PROC;
  151.   END; (* Bltnode *)
  152.  
  153. CONST
  154.  
  155. (* defined bits for bltstat *)
  156.   cleanup* = 40H;
  157.   cleanme* = cleanup;
  158.  
  159.  
  160. (*
  161. **      $VER: cia.h 39.1 (18.9.92)
  162. **
  163. **      registers and bits in the Complex Interface Adapter (CIA) chip
  164. *)
  165.  
  166.  
  167. (*
  168.  * ciaa is on an ODD address (e.g. the low byte) -- $bfe001
  169.  * ciab is on an EVEN address (e.g. the high byte) -- $bfd000
  170.  *
  171.  * do this to get the definitions:
  172.  *    extern struct CIA ciaa, ciab;
  173.  *)
  174.  
  175.  
  176. TYPE
  177.  
  178.   Pad = ARRAY 254 OF SHORTINT;
  179.  
  180.   CIAPtr* = POINTER TO CIA;
  181.   CIA* = RECORD
  182.     pra   * : s.SET8;    pad0 * : Pad;
  183.     prb   * : s.SET8;    pad1 * : Pad;
  184.     ddra  * : s.SET8;    pad2 * : Pad;
  185.     ddrb  * : s.SET8;    pad3 * : Pad;
  186.     talo  * : SHORTINT;  pad4 * : Pad;
  187.     tahi  * : SHORTINT;  pad5 * : Pad;
  188.     tblo  * : SHORTINT;  pad6 * : Pad;
  189.     tbhi  * : SHORTINT;  pad7 * : Pad;
  190.     todlow* : SHORTINT;  pad8 * : Pad;
  191.     todmid* : SHORTINT;  pad9 * : Pad;
  192.     todhi * : SHORTINT;  pad10* : Pad;
  193.     unusedreg* : s.SET8; pad11* : Pad;
  194.     sdr   * : SHORTINT;  pad12* : Pad;
  195.     icr   * : s.SET8;    pad13* : Pad;
  196.     cra   * : s.SET8;    pad14* : Pad;
  197.     crb   * : s.SET8;
  198.   END; (* CIA *)
  199.  
  200.  
  201. CONST
  202.  
  203. (* interrupt control register bit numbers *)
  204.   ta     * = 0;
  205.   tb     * = 1;
  206.   alrm   * = 2;
  207.   sp     * = 3;
  208.   flg    * = 4;
  209.   ir     * = 7;
  210.   setClr * = 7;
  211.  
  212. (* control register A bit numbers *)
  213.   craStart  * = 0;
  214.   craPbon   * = 1;
  215.   craOutmode* = 2;
  216.   craRunmode* = 3;
  217.   craLoad   * = 4;
  218.   craInmode * = 5;
  219.   craSpmode * = 6;
  220.   craTodin  * = 7;
  221.  
  222. (* control register B bit numbers *)
  223.   crbStart  * = 0;
  224.   crbPbon   * = 1;
  225.   crbOutmode* = 2;
  226.   crbRunmode* = 3;
  227.   crbLoad   * = 4;
  228.   crbInmode0* = 5;
  229.   crbInmode1* = 6;
  230.   crbAlarm  * = 7;
  231.  
  232. (*
  233.  * Port definitions -- what each bit in a cia peripheral register is tied to
  234.  *)
  235.  
  236. (* ciaa port A (0BFE001H) *)
  237.   gamePort1 * = 7;   (* gameport 1, pin 6 (fire button) *)
  238.   gamePort0 * = 6;   (* gameport 0, pin 6 (fire button) *)
  239.   dskRdy    * = 5;   (* disk ready *)
  240.   dskTrack0 * = 4;   (* disk on track 00 *)
  241.   dskProt   * = 3;   (* disk write protect *)
  242.   dskChange * = 2;   (* disk change *)
  243.   led       * = 1;   (* led light control (0==>bright) *)
  244.   overlay   * = 0;   (* memory overlay bit *)
  245.  
  246. (* ciaa port B (0BFE101H) -- parallel port *)
  247.  
  248. (* ciab port A (0BFD000H) -- serial and printer control *)
  249.   comDTR    * = 7;   (* serial Data Terminal Ready *)
  250.   comRTS    * = 6;   (* serial Request to Send *)
  251.   comCD     * = 5;   (* serial Carrier Detect *)
  252.   comCTS    * = 4;   (* serial Clear to Send *)
  253.   comDSR    * = 3;   (* serial Data Set Ready *)
  254.   prtrSel   * = 2;   (* printer SELECT *)
  255.   prtrPOut  * = 1;   (* printer paper out *)
  256.   prtrBusy  * = 0;   (* printer busy *)
  257.  
  258. (* ciab port B (0BFD100H) -- disk control *)
  259.   dskMotor  * = 7;   (* disk motorr *)
  260.   dskSel3   * = 6;   (* disk select unit 3 *)
  261.   dskSel2   * = 5;   (* disk select unit 2 *)
  262.   dskSel1   * = 4;   (* disk select unit 1 *)
  263.   dskSel0   * = 3;   (* disk select unit 0 *)
  264.   dskSide   * = 2;   (* disk side select *)
  265.   dskDirec  * = 1;   (* disk direction of seek *)
  266.   dskStep   * = 0;   (* disk step heads *)
  267.  
  268.  
  269. (* cia addresses, initialised to point to correct addresses *)
  270.  
  271. VAR
  272.   ciaa* : CIAPtr;
  273.   ciab* : CIAPtr;
  274.  
  275.  
  276. (*
  277. **      $VER: custom.h 39.1 (18.9.92)
  278. **
  279. **      Offsets of Amiga custom chip registers
  280. *)
  281.  
  282.  
  283. (*
  284.  * do this to get base of custom registers:
  285.  * extern struct Custom custom;
  286.  *)
  287.  
  288.  
  289. TYPE
  290.  
  291.   Coord      * = RECORD v*,h*: SHORTINT END;
  292.   SerialInfo * = RECORD flags * : s.SET8; data * : CHAR END;
  293.   DiskInfo   * = RECORD flags * : s.SET8; data * : SYS.BYTE END;
  294.  
  295.   AudChannelPtr* = POINTER TO AudChannel;
  296.   AudChannel* = RECORD
  297.     ptr* : e.APTR;      (* ptr to start of waveform data *)
  298.     len* : e.UWORD;     (* length of waveform in words *)
  299.     per* : e.UWORD;     (* sample period *)
  300.     vol* : e.UWORD;     (* volume *)
  301.     dat* : e.UWORD;     (* sample pair *)
  302.     pad* : ARRAY 2 OF e.UWORD;  (* unused *)
  303.   END; (* AudChannel *)
  304.   AudChannels* = ARRAY 4 OF AudChannel;
  305.  
  306.   SpriteDefPtr* = POINTER TO SpriteDef;
  307.   SpriteDef* = RECORD
  308.     pos  * : e.UWORD;
  309.     ctl  * : RECORD
  310.       ev    * : SYS.BYTE;
  311.       flags * : s.SET8;
  312.     END;
  313.     data * : LONGINT;
  314.   END; (* SpriteDef *)
  315.   SpriteDefs * = ARRAY 8 OF SpriteDef;
  316.  
  317.   CustomPtr* = POINTER TO Custom;
  318.   Custom* = RECORD
  319.     bltddat * : e.UWORD;
  320.     dmaconr * : s.SET16;
  321.     vposr   * : e.UWORD;
  322.     vhposr  * : e.UWORD;
  323.     dskdatr * : e.UWORD;
  324.     joy0dat * : Coord;
  325.     joy1dat * : Coord;
  326.     clxdat  * : s.SET16;
  327.     adkconr * : s.SET16;
  328.     pot0dat * : Coord;
  329.     pot1dat * : Coord;
  330.     potinp  * : s.SET16;
  331.     serdatr * : SerialInfo;
  332.     dskbytr * : DiskInfo;
  333.     intenar * : s.SET16;
  334.     intreqr * : s.SET16;
  335.     dskpt   * : e.APTR;
  336.     dsklen  * : e.UWORD;
  337.     dskdat  * : e.UWORD;
  338.     refptr  * : e.UWORD;
  339.     vposw   * : e.UWORD;
  340.     vhposw  * : e.UWORD;
  341.     copcon  * : s.SET16;
  342.     serdat  * : SerialInfo;
  343.     serper  * : e.UWORD;
  344.     potgo   * : s.SET16;
  345.     joytest * : Coord;
  346.     strequ  * : e.UWORD;
  347.     strvbl  * : e.UWORD;
  348.     strhor  * : e.UWORD;
  349.     strlong * : e.UWORD;
  350.     bltcon0 * : s.SET16;
  351.     bltcon1 * : s.SET16;
  352.     bltafwm * : s.SET16;
  353.     bltalwm * : s.SET16;
  354.     bltcpt  * : e.APTR;
  355.     bltbpt  * : e.APTR;
  356.     bltapt  * : e.APTR;
  357.     bltdpt  * : e.APTR;
  358.     bltsize * : e.UWORD;
  359.     pad2d   * : SYS.BYTE;
  360.     bltcon0l* : s.SET8; (* low 8 bits of bltcon0, write only *)
  361.     bltsizv * : e.UWORD;
  362.     bltsizh * : e.UWORD;     (* 5e *)
  363.     bltcmod * : e.UWORD;
  364.     bltbmod * : e.UWORD;
  365.     bltamod * : e.UWORD;
  366.     bltdmod * : e.UWORD;
  367.     pad34   * : ARRAY 4 OF e.UWORD;
  368.     bltcdat * : e.UWORD;
  369.     bltbdat * : e.UWORD;
  370.     bltadat * : e.UWORD;
  371.     pad3b   * : ARRAY 3 OF e.UWORD;
  372.     deniseid* : e.UWORD;   (* 7c *)
  373.     dsksync * : e.UWORD;
  374.     cop1lc  * : e.ULONG;
  375.     cop2lc  * : e.ULONG;
  376.     copjmp1 * : e.UWORD;
  377.     copjmp2 * : e.UWORD;
  378.     copins  * : e.UWORD;
  379.     diwstrt * : Coord;
  380.     diwstop * : Coord;
  381.     ddfstrt * : Coord;
  382.     ddfstop * : Coord;
  383.     dmacon  * : s.SET16;
  384.     clxcon  * : s.SET16;
  385.     intena  * : s.SET16;
  386.     intreq  * : s.SET16;
  387.     adkcon  * : s.SET16;
  388.     aud     * : AudChannels;
  389.     bplpt   * : ARRAY 8 OF e.APTR;
  390.     bplcon0 * : s.SET16;
  391.     bplcon1 * : s.SET16;
  392.     bplcon2 * : s.SET16;
  393.     bplcon3 * : s.SET16;
  394.     bpl1mod * : e.UWORD;
  395.     bpl2mod * : e.UWORD;
  396.     bplhmod * : e.UWORD;
  397.     pad86   * : e.UWORD;
  398.     bpldat  * : ARRAY 8 OF e.UWORD;
  399.     sprpt   * : ARRAY 8 OF e.APTR;
  400.     spr     * : SpriteDefs;
  401.     color   * : ARRAY 32 OF e.UWORD;
  402.     htotal  * : e.UWORD;
  403.     hsstop  * : e.UWORD;
  404.     hbstrt  * : e.UWORD;
  405.     hbstop  * : e.UWORD;
  406.     vtotal  * : e.UWORD;
  407.     vsstop  * : e.UWORD;
  408.     vbstrt  * : e.UWORD;
  409.     vbstop  * : e.UWORD;
  410.     sprhstrt* : e.UWORD;
  411.     sprhstop* : e.UWORD;
  412.     bplhstrt* : e.UWORD;
  413.     bplhstop* : e.UWORD;
  414.     hhposw  * : e.UWORD;
  415.     hhposr  * : e.UWORD;
  416.     beamcon0* : s.SET16;
  417.     hsstrt  * : e.UWORD;
  418.     vsstrt  * : e.UWORD;
  419.     hcenter * : e.UWORD;
  420.     diwhigh * : e.UWORD;    (* 1e4 *)
  421.     padf3   * : ARRAY 11 OF e.UWORD;
  422.     fmode   * : e.UWORD;
  423.   END; (* Custom *)
  424.  
  425. CONST
  426.  
  427. (* defines for beamcon register *)
  428.   varVBlank      * = 13;  (* Variable vertical blank enable *)
  429.   loLDis         * = 12;  (* long line disable *)
  430.   cscBlankEn     * = 11;  (* redirect composite sync *)
  431.   varVSync       * = 10;  (* Variable vertical sync enable *)
  432.   varHSync       * =  9;  (* Variable horizontal sync enable *)
  433.   varBeam        * =  8;  (* variable beam counter enable *)
  434.   displayDual    * =  7;  (* use UHRES pointer and standard pointers *)
  435.   displayPAL     * =  6;  (* set decodes to generate PAL display *)
  436.   varCSync       * =  5;  (* Variable composite sync enable *)
  437.   csBlank        * =  4;  (* Composite blank out to CSY* pin *)
  438.   cSyncTrue      * =  3;  (* composite sync true signal *)
  439.   vSyncTrue      * =  1;  (* vertical sync true *)
  440.   hSyncTrue      * =  0;  (* horizontal sync true *)
  441.  
  442. (* new defines for bplcon0 *)
  443.   useBplCon3    * = 1;
  444.  
  445. (* new defines for bplcon2 *)
  446.   zdCTen         * = 10; (* colormapped genlock bit *)
  447.   zdBPen         * = 11; (* use bitplane as genlock bits *)
  448.   zdBPSel0       * = 12; (* three bits to select one *)
  449.   zdBPSel1       * = 13; (* of 8 bitplanes in *)
  450.   zdBPSel2       * = 14; (* zdBPen genlock mode *)
  451.  
  452. (* defines for bplcon3 register *)
  453.   extBlnkEn      * = 0;  (* external blank enable *)
  454.   extBlkZD       * = 1;  (* external blank ored into trnsprncy *)
  455.   zdClkEn        * = 2;  (* zd pin outputs a 14mhz clock*)
  456.   brdnTran       * = 4;  (* border is opaque *)
  457.   brdnBlnk       * = 5;  (* border is opaque *)
  458.  
  459. (* Pointer to custom hardware *)
  460.  
  461. VAR
  462.  
  463.   custom* : CustomPtr;
  464.  
  465. (*
  466. **      $VER: dmabits.h 39.1 (18.9.92)
  467. **
  468. **      include file for defining dma control stuff
  469. *)
  470.  
  471. CONST
  472.  
  473. (* write definitions for dmaconw *)
  474.   dmaSet * = 15;
  475.   aud0   * = 0;
  476.   aud1   * = 1;
  477.   aud2   * = 2;
  478.   aud3   * = 3;
  479.   audio  * = {aud0, aud1, aud2, aud3}; (* 4 bit mask *)
  480.   disk   * = 4;
  481.   sprite * = 5;
  482.   blitter* = 6;
  483.   copper * = 7;
  484.   raster * = 8;
  485.   master * = 9;
  486.   blithog* = 10;
  487.   all* = {aud0 .. raster}; (* all dma channels *)
  488.  
  489.   bitSet * = {dmaSet};
  490.   bitClr * = {};
  491.  
  492. (* read definitions for dmaconr *)
  493. (* bits 0-8 correspnd to dmaconw definitions *)
  494.   bltDone   * = 14;
  495.   bltNZero  * = 13;
  496.  
  497.  
  498. (*
  499. **      $VER: intbits.h 39.1 (18.9.92)
  500. **
  501. **      bits in the interrupt enable (and interrupt request) register
  502. *)
  503.  
  504. CONST
  505.  
  506.   intSet  * =  15;  (* Set/Clear control bit. Determines if bits *)
  507.                     (* written with a 1 get set or cleared. Bits *)
  508.                     (* written with a zero are allways unchanged *)
  509.   intEn   * =  14;  (* Master interrupt (enable only ) *)
  510.   exter   * =  13;  (* External interrupt *)
  511.   dskSync * =  12;  (* Disk re-SYNChronized *)
  512.   rbf     * =  11;  (* serial port Receive Buffer Full *)
  513.   aud3i   * =  10;  (* Audio channel 3 block finished *)
  514.   aud2i   * =   9;  (* Audio channel 2 block finished *)
  515.   aud1i   * =   8;  (* Audio channel 1 block finished *)
  516.   aud0i   * =   7;  (* Audio channel 0 block finished *)
  517.   blit    * =   6;  (* Blitter finished *)
  518.   vertb   * =   5;  (* start of Vertical Blank *)
  519.   coper   * =   4;  (* Coprocessor *)
  520.   ports   * =   3;  (* I/O Ports and timers *)
  521.   softint * =   2;  (* software interrupt request *)
  522.   dskblk  * =   1;  (* Disk Block done *)
  523.   tbe     * =   0;  (* serial port Transmit Buffer Empty *)
  524.  
  525. <*$LongVars-*>
  526.  
  527. BEGIN
  528.   ciaa := SYS.VAL (CIAPtr, 00BFE001H);
  529.   ciab := SYS.VAL (CIAPtr, 00BFD000H);
  530.   custom := SYS.VAL (CustomPtr, 00DFF000H);
  531. END Hardware.
  532.